home *** CD-ROM | disk | FTP | other *** search
/ SPACE 2 / SPACE - Library 2 - Volume 1.iso / utility / 557 / jampack4 / deplzh.s < prev    next >
Text File  |  1991-08-05  |  6KB  |  314 lines

  1. STARTOFPACKEDDATA = $50000
  2. DEPACKPOSITION = $50100
  3.  
  4. ;example of how to call the depack routine
  5.  LEA    STARTOFPACKEDDATA,A6
  6.  LEA    DEPACKPOSITION,A5
  7.  BSR    DEPACK
  8.  
  9.  CLR.W    -(SP)
  10.  TRAP    #1
  11.  
  12.  
  13. * LZH DEPACKER; For use with the JAM Packer V3.0 & 4.0
  14. *
  15. * USAGE:
  16. * LEA $ADDRESS OF PACKED DATA,A5
  17. * LEA $ADDRESS TO UNPACK DATA TO,A6
  18. * BSR DEPACK
  19. *
  20. * NOTE: Must save registers before executing depack if original
  21. *       contents are required.
  22.  
  23. RESET   MOVEM.W D0-D1/D3/D5,-(A7)
  24.     MOVEA.L A1,A2
  25.     MOVEQ   #$00,D2
  26.     MOVEQ   #-$02,D4
  27.     MOVEQ   #$00,D1
  28.     MOVE.W  #$0139,D5
  29. OUTER    ADDQ.W  #2,D4
  30.     CMP.W   (A2)+,D7
  31.     BHI.S   OUTER
  32.     MOVE.W  $00(A3,D4.W),D3
  33.     ADDQ.W  #1,D3
  34.     LSR.W   #1,D3
  35.     CMP.W   -$02(A3,D2.W),D3
  36.     BLS.S     BIDDLE
  37.     MOVE.W  $00(A3,D1.W),D0
  38.     ADD.W   $02(A3,D1.W),D0
  39.     CMP.W   D0,D3
  40.     BLS.S    BIDDLE
  41. BITH    MOVE.W  D0,$00(A3,D2.W)
  42.     MOVE.W  D1,$00(A1,D2.W)
  43.     MOVE.W  D2,$00(A0,D1.W)
  44.     MOVE.W  D2,$02(A0,D1.W)
  45.     ADDQ.W  #2,D2
  46.     ADDQ.L  #4,D1
  47.     MOVE.W  $00(A3,D1.W),D0
  48.     ADD.W   $02(A3,D1.W),D0
  49.     CMP.W   D0,D3
  50.     BHI.S    BITH
  51. BIDDLE    MOVE.W  D3,$00(A3,D2.W)
  52.     MOVE.W  $00(A1,D4.W),D0
  53.     MOVE.W  D0,$00(A1,D2.W)
  54.     MOVE.W  D2,$00(A0,D0.W)
  55.     ADDQ.W  #2,D2
  56.     DBF     D5,OUTER
  57. MAKETABLE2
  58.     MOVE.W  $00(A3,D1.W),D0
  59.     ADD.W   $02(A3,D1.W),D0
  60.     MOVE.W  D0,$00(A3,D2.W)
  61.     MOVE.W  D1,$00(A1,D2.W)
  62.     MOVE.W  D2,$00(A0,D1.W)
  63.     MOVE.W  D2,$02(A0,D1.W)
  64.     ADDQ.W  #2,D2
  65.     ADDQ.L  #4,D1
  66.     CMP.W   D7,D2
  67.     BNE.S    MAKETABLE2
  68.     MOVEM.W (A7)+,D0-D1/D3/D5
  69.     RTS     
  70.  
  71. CREATE  MOVE.L    TABLE7(PC),A0
  72.     LEA     TDATA1(PC),A1
  73.     MOVEQ   #$00,D0
  74.     MOVEQ   #$1F,D1
  75.     MOVEQ   #$00,D2
  76. LOOP1   MOVE.B  D0,(A0)+
  77.     DBF     D1,LOOP1
  78.     DBF     D2,EXIT1
  79.     MOVE.W  (A1)+,D3
  80.     MOVEQ   #$03,D2
  81. EXIT1   ROL.W   #4,D3
  82.     MOVE.W  D3,D1
  83.     ANDI.W  #$000F,D1
  84.     ADDQ.B  #4,D0
  85.     BCC.S   LOOP1
  86.     MOVE.L    TABLE8(PC),A0
  87.     LEA     TDATA2(PC),A1
  88.     MOVEQ   #$05,D0
  89.     MOVEQ   #$03,D1
  90. LOOP2   MOVE.B  $00(A1,D0.W),D2
  91.     EXT.W   D2
  92. LOOP3   MOVE.B  D1,(A0)+
  93.     DBF     D2,LOOP3
  94.     ADDQ.W  #1,D1
  95.     DBF     D0,LOOP2
  96.     RTS
  97.  
  98. CREATE2 MOVE.L    TABLE1(PC),A0
  99.     MOVE.L    TABLE5(PC),A1
  100.     MOVE.L    TABLE4(PC),A2
  101.     MOVEQ   #$01,D1
  102.     MOVE.W  #$04E6,D2
  103.     MOVEQ   #$00,D4
  104.     MOVE.W  #$0139,D0
  105. CONTINUE
  106.     MOVE.W  D1,(A0)+
  107.     MOVE.W  D2,(A1)+
  108.     MOVE.W  D4,(A2)+
  109.     ADDQ.W  #2,D2
  110.     ADDQ.W  #2,D4
  111.     DBF     D0,CONTINUE
  112.     MOVE.L    TABLE1(PC),A0
  113.     MOVE.L    TABLE2(PC),A3
  114.     MOVE.L    TABLE6(PC),A1
  115.     MOVE.L    TABLE3(PC),A2
  116.     MOVE.W  #$0274,D2
  117.     MOVEQ   #$00,D4
  118.     MOVE.W  #$0138,D0
  119. DOMORE    MOVE.W  (A0)+,D1
  120.     ADD.W   (A0)+,D1
  121.     MOVE.W  D1,(A3)+
  122.     MOVE.W  D4,(A1)+
  123.     MOVE.W  D2,(A2)+
  124.     MOVE.W  D2,(A2)+
  125.     ADDQ.W  #4,D4
  126.     ADDQ.W  #2,D2
  127.     DBF     D0,DOMORE
  128.     MOVE.W  #$FFFF,(A3)
  129.     CLR.W   (A2)
  130.     RTS     
  131.  
  132. RESTORE BSR     RESET
  133.     BRA     BACK
  134.  
  135. TABLE1 DC.L 00
  136. TABLE2 DC.L 00
  137. TABLE3 DC.L 00
  138. TABLE4 DC.L 00
  139. TABLE5 DC.L 00
  140. TABLE6 DC.L 00
  141. TABLE7 DC.L 00
  142. TABLE8 DC.L 00
  143.  
  144. EXIT
  145.     ADDQ.L    #4,A7
  146.     RTS
  147.  
  148. DEPACK
  149.     LEA    TABLE1(PC),A0
  150.     MOVE.L    #0,(A0)        ;SET UP RELATIVE TABLE OFFSETS
  151.     MOVE.L    #$274,4(A0)
  152.     MOVE.L    #$4E8,8(A0)
  153.     MOVE.L    #$9CE,12(A0)
  154.     MOVE.L    #$C42,16(A0)
  155.     MOVE.L    #$EB6,20(A0)
  156.     MOVE.L    #$112A,24(A0)
  157.     MOVE.L    #$122A,28(A0)
  158.  
  159.     MOVE.L    A7,D1        ;GET STACK POSITON
  160.     sub.l    #$1500,D1    ;TABLES START ADDRESS IN D1
  161.                 ;STORE UNDER STACK (NASTY!)
  162.     MOVE.W    #7,D0
  163. TABLOOP
  164.     ADD.L    D1,(A0)+    ;ADD TABLE BASE ADDRESS TO OFFSETS
  165.     DBF    D0,TABLOOP
  166.     
  167.     BSR    CREATE
  168.     BSR     CREATE2
  169.     MOVE.L    TABLE3(PC),A0
  170.     MOVE.L    TABLE5(PC),A1
  171.     MOVE.L    TABLE1(PC),A3
  172.     MOVE.L  A6,-(A7)
  173.     ADD.L    4(A5),A6
  174.     ADD.L    8(A5),A5
  175.     ADD.L    #$0C,A5
  176.     MOVE.L    A6,A4
  177.  
  178.     MOVE.W    #59,D0        ;MOVE 60 SPACES TO END OF UNPACKED AREA
  179. SPACES    MOVE.B    #$20,(A4)+    ;NOTE: SHOULD PROBABLY SAVE THIS AREA
  180.     DBF    D0,SPACES    ;      BEFORE WIPING IT OUT!
  181.  
  182.     MOVEQ   #$08,D6
  183.     MOVE.B  -(A5),D5
  184.     MOVE.W  #$04E6,D7
  185.     MOVE.L    TABLE8(PC),A4
  186.  
  187. TOP    MOVE.W    #$222,$FFFF8240.W
  188.     MOVE.W  #0,$FFFF8240.W
  189.     CMPA.L  (A7),A6
  190.     BLE    EXIT
  191.  
  192.     MOVE.W  $04E4(A1),D0
  193. MORE    DBF     D6,NOTEMPTY
  194.     MOVEQ   #$07,D6
  195.     MOVE.B  -(A5),D5
  196. NOTEMPTY
  197.     ADD.B   D5,D5
  198.     BCC.S   ZERO
  199.     ADDQ.W  #2,D0
  200. ZERO    MOVE.W  $00(A1,D0.W),D0
  201.     CMP.W   D7,D0
  202.     BLT.S   MORE
  203.     MOVE.W  D0,D1
  204.     SUB.W   D7,D0
  205.     MOVE.W  $04E4(A3),D4
  206.     BMI    RESTORE
  207.  
  208. BACK    MOVE.W  $00(A0,D1.W),D1
  209. SCAN    LEA     $00(A3,D1.W),A2
  210.     ADDQ.W  #1,(A2)
  211.     CMPM.W  (A2)+,(A2)+
  212.     BCS.S   FRSTGTR
  213.     MOVE.W  $00(A0,D1.W),D1
  214.     BNE.S   SCAN
  215.     LSR.W   #1,D0
  216.     CMP.W   #$0100,D0
  217.     BGE.S   GTE256
  218. WRITE    MOVE.B    D0,-(A6)
  219.     BRA.S   TOP
  220.  
  221. FRSTGTR SUBQ.W  #1,-$0004(A2)
  222.     MOVE.W  -$0004(A2),D4
  223. SAME    CMP.W   (A2)+,D4
  224.     BEQ.S   SAME
  225.     SUBQ.L  #4,A2
  226.     ADDQ.W  #1,(A2)
  227.     SUBA.L  A3,A2
  228.     MOVE.W  $00(A1,D1.W),D4
  229.     MOVE.W  A2,$00(A0,D4.W)
  230.     CMP.W   D7,D4
  231.     BCC.S   SKIP
  232.     MOVE.W  A2,$02(A0,D4.W)
  233. SKIP    MOVE.W  $00(A1,A2.W),D2
  234.     MOVE.W  D4,$00(A1,A2.W)
  235.     MOVE.W  D1,$00(A0,D2.W)
  236.     CMP.W   D7,D2
  237.     BCC.S   SKIP2
  238.     MOVE.W  D1,$02(A0,D2.W)
  239. SKIP2   MOVE.W  D2,$00(A1,D1.W)
  240.     MOVE.W  $00(A0,A2.W),D1
  241.     BNE.S   SCAN
  242.     LSR.W   #1,D0
  243.     CMP.W   #$0100,D0
  244.     BLT.S   WRITE
  245. GTE256    MOVE.B  -1(A5),D1
  246.     MOVEQ   #$00,D2
  247.     LSR.B   D6,D1
  248.     OR.B    D5,D1
  249.     MOVE.B  $00(A4,D1.W),D2
  250.     SUB.W   D2,D6
  251.     BPL.S   POSITIVE
  252.     MOVE.B  -(A5),D5
  253.     MOVE.B  D5,D4
  254.     ADDQ.W  #2,D6
  255.     BMI.S   OVERFLOW
  256.     BEQ.S   MODD4
  257.     LSR.B   #1,D4
  258.     LSL.B   #7,D5
  259.     BRA.S   MODD4
  260. READONE MOVE.B  -(A5),D5
  261.     MOVE.B  D5,D4
  262.     LSL.B   #6,D5
  263.     MOVEQ   #$02,D6
  264.     LSR.B   D6,D4
  265.     BRA.S   DOCOPY
  266. POSITIVE
  267.     BEQ.S   READONE
  268.     MOVE.B (A5),D5
  269.     SUBQ.W  #6,D6
  270. OVERFLOW
  271.     NEG.W   D6
  272.     LSL.B   D6,D5
  273.     MOVE.B  D5,D4
  274.     MOVE.B  -(A5),D5
  275.     MOVE.B  D5,D2
  276.     LSL.B   D6,D5
  277.     SUBQ.W  #8,D6
  278.     NEG.W   D6
  279.     LSR.B   D6,D2
  280.     OR.B    D2,D4
  281. MODD4   ANDI.W  #$003F,D4
  282. DOCOPY    MOVE.L    TABLE7(PC),A0
  283.     MOVE.B  (A0,D1.W),D2
  284.     LSL.W   #4,D2
  285.     OR.B    D4,D2
  286.     ;NEG.W   D2
  287.     LEA     $01(A6,D2.W),A0
  288.     SUBI.W  #$00FE,D0
  289.     MOVE.W  D0,D1
  290. COPY    MOVE.B  -(A0),D0
  291.     MOVE.B  D0,-(A6)
  292.     DBF     D1,COPY
  293.     MOVE.L    TABLE3(PC),A0
  294.     BRA    TOP
  295.  
  296. TDATA2    DC.W    $0F2F
  297.     DC.W    $2F3F
  298.     DC.W    $2F1F
  299. TDATA1
  300.     DC.W    $FFF7
  301.     DC.W    $7777
  302.     DC.W    $7773
  303.     DC.W    $3333
  304.     DC.W    $3333
  305.     DC.W    $3331
  306.     DC.W    $1111
  307.     DC.W    $1111
  308.     DC.W    $1111
  309.     DC.W    $1111
  310.     DC.W    $1111
  311.     DC.W    $1110
  312.     DC.L    $00
  313.     DC.L    $00
  314.